package TestDemo;

/**
 1.  向上转型的实现
 Animal b=new Bird(); //向上转型
 b.eat(); // 调用的是子类的eat()方法
 b.fly(); // 报错!!!!!-------b虽指向子类对象，但此时子类作为向上转型的代价丢失和父类不同的fly()方法------
 2.为何不直接Bird b=new Bird();b.eat() 呢？
 这样就没有体现出面向对象的抽象的编程思想呀，降低了代码的可扩展性.

 3.向上转型的好处？
 sleep(new Male());//调用方法时传入的参数是子类
 sleep(new Female());

 public static void sleep(Human h) //方法的参数是父类
 {
    h.sleep();
 }
 如上代码就是用的向上转型，若是不用向上转型，那么有多少个子类就得在这儿写多少种不同的睡觉方法~~~~~~
 */
public class InstanceUp
{
    public static void main(String[] args)
    {
        Animal b=new Bird(); //向上转型
        b.eat();
        //  b.fly(); b虽指向子类对象，但此时子类作为向上的代价丢失和父类不同的fly()方法
        sleep(new Male());
        sleep(new Female());//传入的参数是子类-----！！
    }

    public static void sleep(Human h) //方法的参数是父类------！！！
    {
        h.sleep();
    }
}

class Animal
{
    public void eat()
    {
        System.out.println("父类的 eating...");
    }
}
class Bird extends Animal
{
    @Override
    public void eat()
    {
        System.out.println("子类重写的父类的  eatting...");
    }
    public void fly()
    {
        System.out.println("子类新方法  flying...");
    }
}

class Human
{
    public void sleep()
    {
        System.out.println("父类人类   sleep..");
    }
}

class Male extends Human
{
    @Override
    public void sleep()
    {
        System.out.println("男人 sleep..");
    }
}

class Female extends Human
{
    @Override
    public void sleep()
    {
        System.out.println("女人 sleep..");
    }
}
